﻿using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using TVPeruRFIDMovil.Formularios;
using TVPeruRFIDMovil.ServicioWS;
using TVPeruRFIDMovil.Clases.Negocio;
using LH.Library;
using LH.PsionRFID;
using TVPeruRFIDMovil.Clases.Movil;
using TVPeruRFIDMovil.Herramientas;

//using PsionTeklogix.Keyboard;
//using PsionTeklogix.Trigger;
//using com.caen.RFIDLibrary;
//using PsionTeklogix.RFID;

namespace TVPeruRFIDMovil
{
    public partial class frmRegistrarMovimientoSalida : frmBase
    {

        //#region Psion Trigger Members and Functions

        //private TriggerControl tc = null;
        //const string TemporaryClient = "CAEN_TRIGGER";

        //void TriggerClose()
        //{
        //    if (tc != null)
        //    {
        //        try
        //        {
        //            tc.triggerEvent += new TriggerEventHandler(OnTriggerEvent);
        //            tc.DeregisterFromEvents(TemporaryClient);
        //            tc.DeregisterConsumer(TemporaryClient);
        //        }
        //        catch
        //        {
        //        }
        //        finally
        //        {
        //            tc.Dispose();
        //            tc = null;
        //        }
        //    }
        //}

        //bool TriggerInit()
        //{
        //    // Instantiate Trigger Control
        //    try
        //    {
        //        tc = new TriggerControl();
        //    }
        //    catch
        //    {
        //        TriggerClose();
        //        return false;
        //    }

        //    // Initialize Trigger Control
        //    try
        //    {
        //        tc.Initialize();
        //    }
        //    catch
        //    {
        //        TriggerClose();
        //        return false;
        //    }

        //    ArrayList names = new ArrayList();
        //    try
        //    {
        //        tc.GetRegisteredConsumers(names);
        //    }
        //    catch
        //    {
        //        TriggerClose();
        //        return false;
        //    }

        //    Boolean ConsumerAlreadExist = false;
        //    foreach (string s in names)
        //    {
        //        if (s.Equals(TemporaryClient))
        //        {
        //            ConsumerAlreadExist = true;
        //            break;
        //        }
        //    }

        //    // Register the temporary trigger event consumer
        //    if (ConsumerAlreadExist == false)
        //    {
        //        try
        //        {
        //            tc.RegisterConsumer(TemporaryClient);
        //        }
        //        catch
        //        {
        //            TriggerClose();
        //            return false;
        //        }
        //    }

        //    try
        //    {
        //        uint flags = (TriggerControl.Flags.Override | TriggerControl.Flags.Temporary | TriggerControl.Flags.WantsTriggerEvents);

        //        tc.AddMapping(0, TemporaryClient, flags);
        //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.HandgripScan), TemporaryClient, flags);
        //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.Scan), TemporaryClient, flags);
        //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.LeftScan), TemporaryClient, flags);
        //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.RightScan), TemporaryClient, flags);
        //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.SideLeftScan), TemporaryClient, flags);
        //        tc.AddMapping(Keyboard.TranslateToTriggerID(Key.SideRightScan), TemporaryClient, flags);
        //    }
        //    catch
        //    {
        //        TriggerClose();
        //        return false;
        //    }

        //    // Register for events
        //    try
        //    {
        //        tc.RegisterForEvents(TemporaryClient);
        //    }
        //    catch
        //    {
        //        TriggerClose();
        //        return false;
        //    }

        //    // Add delegate
        //    try
        //    {
        //        tc.triggerEvent += new TriggerEventHandler(OnTriggerEvent);
        //    }
        //    catch
        //    {
        //        TriggerClose();
        //        return false;
        //    }
        //    return true;
        //}

        //private void OnTriggerEvent(object sender, TriggerEvent e)
        //{
        //    switch (e.EventFlags)
        //    {
        //        case TriggerEvent.TriggerUp:
        //            {
        //                //Cuando se presiona
        //            }
        //            break;
        //        case TriggerEvent.TriggerDown:
        //            {
        //                //Cuando se suelta
        //            }
        //            break;
        //    }
        //}

        //#endregion

        #region --- Variables y Constantes ---
        public Solicitud solicitud { get; set; }
        public DetalleBienSolicitud[] listaDetalleBienSolicitudObt { get; set; }
        //private Bien bien = null;
        private List<DetalleBienMovimiento> listaDetalleBienMovimiento = new List<DetalleBienMovimiento>();

        #endregion
       
        #region --- Constructor ---
        public frmRegistrarMovimientoSalida()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos formulario ---

        private void frmRegistrarMovimientoSalida_Load(object sender, EventArgs e)
        {
            cargarFormulario();  
        }

        private void mnuSalir_Click(object sender, EventArgs e)
        {
            salir(DialogResult.Cancel);
        }

        private void mnuAceptar_Click(object sender, EventArgs e)
        {
            guardar();
        }

        #endregion

        #region --- Metodos Propios ---

        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.WindowState = FormWindowState.Maximized;

                // Se agrega muestra el detalle de OC
                this.lvwListado.BeginUpdate();
                this.lvwListado.Items.Clear();

                ListViewItem nuevoItem = null;

                // Cuando lineas de la orden de compra
                foreach (DetalleBienSolicitud detalleBienSolicitud in this.listaDetalleBienSolicitudObt)
                {
                    nuevoItem = new ListViewItem(detalleBienSolicitud.etiqueta.bien.codBarra);
                    nuevoItem.SubItems.Add(detalleBienSolicitud.etiqueta.bien.descripcion);
                    this.lvwListado.Items.Add(nuevoItem);
                }

                this.lvwListado.EndUpdate();

            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            } 
        }

        private void procesarLectura (LH.PsionRFID.ListaTag listaTag) //private void procesarLectura(string epc)
        {
            ListViewItem viewBienActual = null;
            int indice = 0;

            try
            {
                // Si no hay epc leidos, entonces salir
                if (listaTag.Count == 0) { return; }

                // Validar que haya buscado primero el bien
                if (this.listaDetalleBienSolicitudObt == null) { return; }

                // Desactiva el lector RFID
                quitarEventoGatillo();

                // Filtrar Listado de Tag repetidos
                listaTag = filtrarListadoTagEpc(listaTag);

                Cursor.Current = Cursors.WaitCursor;
                foreach (LH.PsionRFID.Tag tag in listaTag)
                {
                    indice = 0;
                    foreach (DetalleBienSolicitud detalleBien in this.listaDetalleBienSolicitudObt)
                    {
                        if (detalleBien.etiqueta.epc.Equals(tag.Epc))
                        {
                            viewBienActual = this.lvwListado.Items[indice];

                            // Validar por el color si la fila, ya fue despachada
                            if (viewBienActual.BackColor == Color.Green)
                            {
                                Util.ShowMessageboxExclamacion("El bien ya fue atendido");
                                return;
                            }

                            // Cambiar de color de la fila, para indicar si esta completo
                            viewBienActual.BackColor = Color.Green;

                            //LlenarDetalleMovimiento
                            DetalleBienMovimiento detalleBienMovimiento = new DetalleBienMovimiento();
                            detalleBienMovimiento.bien = new Bien();
                            detalleBienMovimiento.bien.idBien = detalleBien.etiqueta.bien.idBien;
                            detalleBienMovimiento.bien.codBienEstado = detalleBien.etiqueta.bien.codBienEstado;
                            detalleBienMovimiento.bien.codBienSituacion = detalleBien.etiqueta.bien.codBienSituacion;
                            detalleBienMovimiento.usuarioRegistra = new Usuario();
                            detalleBienMovimiento.usuarioRegistra.idUsuario = ParametrosAplicacion.USUARIO_ACTUAL.idUsuario;

                            this.listaDetalleBienMovimiento.Add(detalleBienMovimiento);
                            break;
                        }
                        //else
                        //{
                        //    Util.ShowMessageboxExclamacion("no se encontró bien en la lista");
                        //}
                        indice++;
                    }           
                }
            }
            catch (Exception ex)
            {
                    mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
              // Activa el lector RFID
              agregarEventoGatillo();
              Cursor.Current = Cursors.Default;
            }
        }

        private LH.PsionRFID.ListaTag filtrarListadoTagEpc(LH.PsionRFID.ListaTag listaTag)
        {
            LH.PsionRFID.ListaTag listaTagResultado = new LH.PsionRFID.ListaTag();

            foreach (LH.PsionRFID.Tag tag in listaTag)
            {
                // Validar que sea una etiqueta con la cabecera de servir
                if (MetodosAplicacion.esEtiquetaValida(tag.Epc))
                {
                    if (!esRepetido(listaTagResultado, tag.Epc))
                    {
                        listaTagResultado.Add(tag);
                    }
                }
            }

            return listaTagResultado;
        }

        private bool esRepetido(LH.PsionRFID.ListaTag listaTag, string epc)
        {
          bool resultado = false;

          foreach (LH.PsionRFID.Tag tag in listaTag)
          {
            if (tag.Epc.Equals(epc))
            {
               resultado = true;
               break;
            }
          }

          return resultado;
        }


        private bool validarEntrada()
        {
            bool resultado = false;

            if ((this.listaDetalleBienMovimiento == null) || (this.listaDetalleBienMovimiento.Count < 1))
            {
                Util.ShowMessageboxInfo("Debe recibir por lo menos un bien para guardar", this.Text);
                return true;
            }

            return resultado;
        }

        private void guardar()
        {
            Movimiento movimientoEnviar = null;
            int resultadoMovimiento = 0;

            try
            {
                if (validarEntrada()) { return; }

                if (!Util.ShowMessageboxPregunta("¿Esta seguro de realizar la salida")) { return; }

                Cursor.Current = Cursors.WaitCursor;

                //Registrar Movimiento 
                movimientoEnviar = new Movimiento();
                movimientoEnviar.idMovimientTipo = Constantes.TIPO_MOVIMIENTO_SALIDA;
                movimientoEnviar.usuarioRegistra = new Usuario();
                movimientoEnviar.usuarioRegistra.idUsuario = ParametrosAplicacion.USUARIO_ACTUAL.idUsuario;
                movimientoEnviar.solicitud = new Solicitud();
                movimientoEnviar.solicitud.codSolicitud = this.solicitud.codSolicitud;

                using (Interfase interfase = new Interfase())
                {
                    resultadoMovimiento = interfase.registrarMovimiento(this.listaDetalleBienMovimiento, movimientoEnviar);
                }

                if (resultadoMovimiento > 0)
                {
                    Util.ShowMessageboxInfo("Se registró movimiento salida correctamente");
                    salir(DialogResult.OK);
                }

                else
                {
                    Util.ShowMessageboxExclamacion("No se registró movimiento salida");
                }


            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void salir(DialogResult resultado)
        {
            this.DialogResult = resultado;
        }

        #endregion

        //private void timer1_Tick(object sender, EventArgs e)
        //{
        //    //if (MetodosAplicacion.esEtiquetaValida(tag.Epc))
        //    //{
        //    //    procesarLectura(tag.Epc);
        //    //}
        //}


        #region --- Eventos LectorRFID ---
        protected override void OnInicioCapturaData()
        {
            
        }

        protected override void OnCapturaData(LH.PsionRFID.Tag tag)
        {
            // Validar que sea una etiqueta con la cabecera

            
        }

        protected override void OnFinCapturaData(LH.PsionRFID.ListaTag listaTag)
        {

            procesarLectura(listaTag);
        }

        #endregion



    }
}